/*
    select函数的基本用法了解
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/select.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>

int main()
{
    char buf[128];

    // 创建文件描述符集合
    fd_set inputs;
    int count;
    while(1)
    {
        // 每次执行完 select都要重现加载 描述符集合中的数据
        // 清空集合中的所有位
        FD_ZERO(&inputs);
        FD_SET(STDIN_FILENO, &inputs);
        // 参数 监听的最大的文件描述符+1 监听读文件描述符集合  监听写文件描述符集合 
        // 监听异常处理文件描述的集合  超时时间 （就是最多等待多久返回，NULL为一直等待）
        struct timeval time;
        // 设置最多等待3秒
        // 时间要初始化完全，否则微秒可能为栈上的垃圾值，时间会不确定
        time.tv_sec = 3;
        time.tv_usec = 0;
        
        count  = select(STDIN_FILENO+1, &inputs, NULL, NULL, &time);
        switch(count)
        {
            case 0:
                printf("没有文件描述符就绪，time_out!\n");
                break;
            case -1:
                // 错误打印
                perror("select");
                break;
            default:
                printf("select 函数的值为%d\n", count);
                if(FD_ISSET(STDIN_FILENO, &inputs) == 1)
                {
                    int ret = read(STDIN_FILENO, buf, sizeof(buf));
                    if(ret == 0)
                        printf("键盘就绪!\n");
                    else
                        printf("读取到：%s",buf);
                }
                break;
        }
    }
    return 0;
}